# Ansible role: keepalived

Роль выполняет настройку кластера keepalived

Основные возможности:
- Настройка одного или нескольких vip адресов для кластера
- Добавления произвольных скриптов для проверки состояния кластера

> В качестве примера роль содержит скрипт patroni-restapi-check.sh для проверки состояния кластера patroni

## Поддерживаемые ОС

| Операционная система | Статус |
| ------------------------- |:---:|
| Alt Linux 10 | :white_check_mark: |
| Astra Linux 1.7 | :white_check_mark: |

- :white_check_mark: - Поддерживается
- :no_entry: - Не подерживается
- :grey_question: - Частично работает

## Описание переменных

Пользователь, для выполнения скриптов vrrp_script
```
keepalived_scripts_user: "keepalived"
```

Путь расположения скриптов
```
keepalived_scripts_path: "/usr/libexec/keepalived"
```

Список скриптов, которые будут скопированы на сервера модулем template:
```
keepalived_scripts:
  - name: patroni-restapi-check.sh
    source: patroni-restapi-check.sh.j2
```

Шаблон конфигурационного файла keepalived
```
keepalived_config_source: "keepalived.conf.j2"
```

Список серверов кластера. Внутри списка должны быть указаны параметры host и ip всех серверов в кластере.
Имена серверов должны соответствовать inventory_hostname
```
keepalived_cluster_hosts: []
#  - ip: "ip aдрес сервера 1"
#    host: "inventory_hostname сервера 1"
#  - ip: "ip aдрес сервера 2"
#    host: "inventory_hostname сервера 2"
```

Список vip адресов.
```
keepalived_vip: []
# Необходимые параметры для элементов keepalived_vip
#  - id: Уникальный id для vrrp_instance
#    vip: Виртуальный адрес
#    interface: Имя интерфейса
#    state: Начальное состояние адреса MASTER|BACKUP
#    priority: Приоритет сервера
#    vrrp_script: Скрипт проверки для повышения приоритета
#    check: Параметр, передаваемый в vrrp_script
```

Определение ip адреса сервера inventory_hostname
```
keepalived_ip: "{{ (keepalived_cluster_hosts | items2dict(key_name='host', value_name='ip'))[inventory_hostname] }}"
```

Имя группы серверов, длял выбора приоритета по умолчанию. Группа должна содержать все сервера кластера keepalived
```
# Необходимо определить в inventory
# keepalived_group_name: "{{ postgres_cluster_name }}"
```

Выбор приоритета по умолчанию по индексу сервера в группе keepalived_group_name
```
keepalived_priority: "{{ 100 - groups[keepalived_group_name].index(inventory_hostname)*10 }}"
```

## Пример описания

Пример описания для двух vip адресов в кластере patroni из трех узлов. Первый vip поднимается на мастере, второй на одной из реплик. 
Переменные описаны в group_vars для группы cats_patroni_db, куда входят все сервера кластера.

```
keepalived_group_name: "cats_patroni_db"
keepalived_cluster_hosts:
  - {host: "cats-patroni-db01", ip: "192.168.56.101"}
  - {host: "cats-patroni-db02", ip: "192.168.56.102"}
  - {host: "cats-patroni-db03", ip: "192.168.56.103"}

keepalived1_vip_address: "192.168.56.100/24"
keepalived1_interface: "enp0s8"
keepalived1_id: "{{ keepalived1_vip_address.split('.')[3].split('/')[0] }}"

keepalived2_vip_address: "192.168.56.110/24"
keepalived2_interface: "enp0s8"
keepalived2_id: "{{ keepalived2_vip_address.split('.')[3].split('/')[0] }}"

keepalived_vip:
  - id: "{{ keepalived1_id }}"
    vip: "{{ keepalived1_vip_address }}"
    interface: "{{ keepalived1_interface }}"
    state: "MASTER"
    priority: "{{ keepalived_priority }}"
    vrrp_script: "patroni-restapi-check.sh"
    check: "primary"
  - id: "{{ keepalived2_id }}"
    vip: "{{ keepalived2_vip_address }}"
    interface: "{{ keepalived2_interface }}"
    state: "MASTER"
    priority: "{{ keepalived_priority }}"
    vrrp_script: "patroni-restapi-check.sh"
    check: "replica"
```